package secondary

/*
	写一个函数，求两个整数之和，要求在函数体内不得使用 “+”、“-”、“*”、“/” 四则运算符号。


	示例:

	输入: a = 1, b = 1
	输出: 2

	提示：

	a,b均可能是负数或 0
	结果不会溢出 32 位整数

	来源：力扣（LeetCode）
	链接：https://leetcode-cn.com/problems/bu-yong-jia-jian-cheng-chu-zuo-jia-fa-lcof
	著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
*/
func Add(a int, b int) int {
	return add2(a, b)
}

/*
	转换为二进制相加、需要考虑到进位的问题
*/
func add(a int, b int) int {
	for b != 0 {
		sum := a ^ b
		carry := a & b << 1
		a = sum
		b = carry
	}
	return a
}

func add2(a, b int) int {
	var s int
	var f func(a, b int) bool
	f = func(a, b int) bool {
		s = a ^ b
		c := (a & b) << 1
		a = s
		b = c
		return b != 0 && f(a, b) // 注意、这里进位之处的判断条件只能是b!=0、不能使用b>0、因为要支持负数的运算
	}
	f(a, b)
	return s
}
